package com.edu.juc.assistClass;

import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.TimeUnit;

// CyclicBarrier
// 一个同步辅助类，允许一组线程互相等待，直到到达某个公共屏障点(common barrier point)。
// 在涉及一组固定大小的线程的程序中，这些线程必须不时地相互等待，此时 CyclicBarrier 就派上用场了。
// 因为该 barrier 在释放等待线程后可以重用，所以称它为 循环 barrier。
// 集齐七颗龙珠后可以召唤神龙。
public class CyclicBarrierTest {
    public static void main(String[] args) {
        CyclicBarrier cyclicBarrier = new CyclicBarrier(7, () -> {
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            System.out.println("召唤神龙");
        });

        for (int i = 1; i <= 7; i++) {
            int finalI = i;
            new Thread(() -> {
                System.out.println(Thread.currentThread().getName() + "收集到第" + finalI + "颗龙珠");
                try {
                    cyclicBarrier.await();
                } catch (Exception e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() + "已开始");
            }, String.valueOf(i)).start();
        }
    }
}
